package com.common.base.tools.utils

import android.text.TextUtils
import androidx.collection.ArrayMap
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.common.base.tools.utils.Logs.error
import org.json.JSONObject
import java.io.BufferedReader
import java.io.InputStreamReader
import java.lang.reflect.Type

/**
 * 三疯
 * *************************
 *
 *
 * *************************
 */
object JsonUtils {
    private var mGson: Gson? = null

    /**
     * @param jsonObject 需要转换成map的json数据源
     * @return 返回转换之后的map集合, 注意返回的集合类型是<String></String>, String>
     */
    fun convertToMap(jsonObject: JSONObject): Map<String, String> {
        val map: MutableMap<String, String> = ArrayMap()
        try {
            val keysItr = jsonObject.keys()
            while (keysItr.hasNext()) {
                val key = keysItr.next()
                init()
                // 多层嵌套的数据结构在此只转换成了普通的Str
                val value = mGson!!.toJson(jsonObject[key])
                map[key] = value
            }
        } catch (e: Exception) {
            error("JsonObject Convert To Map failed", e)
        }
        return map
    }

    /**
     * @param jsonStr     需要转换的数据str
     * @param entityClass 对应需要转换成的class类类型
     * @param <T>         类型定义
     * @return 具体转换之后的Entity数据结构
    </T> */
    fun <T> jsonToEntity(jsonStr: String?, entityClass: Class<T>): T {
        if (TextUtils.isEmpty(jsonStr)) {
            return entityClass.newInstance()
        }
        var targetEntity: T = entityClass.newInstance()
        try {
            init()
            targetEntity = mGson!!.fromJson(jsonStr, entityClass)
        } catch (e: Exception) {
            error("json转换成:" + entityClass.simpleName + "异常", e)
        }
        return targetEntity
    }

    /**
     * 兼容问题，原有的JsonUtils#fromJson()有这样的方法
     *
     * @param jsonStr     数据源
     * @param entityClass 数据类型
     * @param <T>         数据类型
     * @return 转换之后的数据结构
    </T> */
    fun <T> fromJson(jsonStr: String?, entityClass: Class<T>): T {
        return jsonToEntity(jsonStr, entityClass)
    }

    /**
     * @param jsonStr 数据源
     * @param type    数据类型
     * @param <T>     转换的数据结构定义
     * @return 数据
    JsonUtils.fromJson<MutableList<NationalBean>>(
    nationalFlag,
    object : TypeToken<List<NationalBean>>() {}.type)
     *
    </T> */
    fun <T> fromJson(jsonStr: String?, type: Type): T? {
        if (TextUtils.isEmpty(jsonStr)) {
            return null
        }
        var targetEntity: T? = null
        try {
            init()
            targetEntity = mGson!!.fromJson(jsonStr, type)
        } catch (e: Exception) {
            error("json转换成:" + type + "异常", e)
        }
        return targetEntity
    }

    /**
     * @param object 数据源
     * @return 转换之后的字符
     */
    fun toJson(`object`: Any?): String {
        return try {
            init()
            mGson!!.toJson(`object`)
        } catch (e: Exception) {
            ""
        }
    }

    val json: Gson?
        get() {
            init()
            return mGson
        }

    private fun init() {
        if (mGson == null) // 去除对于特殊符号的转译的异常处理
            mGson = GsonBuilder().disableHtmlEscaping().create()
    }

    /**
     * 读取世界各国的区号
     */
     fun readAssetsJson(fileName:String):String{
        var br: BufferedReader? = null
        var json:String= ""
        try {
            br = BufferedReader(InputStreamReader(ApplicationUtils.context().resources.assets.open(fileName)))
            var line: String? = null
            val sb = StringBuilder()
            while (br.readLine().also { line = it } != null){
                sb.append(line)
            }
            br.close()
            json = sb.toString()
        } catch (e: Exception) {
            logger.error(e)
        }finally {
            br?.close()
        }
        return json
    }
}